package pokeronlab_2014;

import libsvm.*;

/**
 * Az opponentModeller által használt SVM osztályozó
 * 
 * @author andras        
 */
public class SVMClassifierFactory {
	/**
	 * @param data
	 *            A paraméterként kapott, szituációtól függő bemenet
	 * @return Megjósolt cselekvés egy ellenfélre
	 */
	svm_parameter parameter;
	svm_problem problem;

	/**
	 * Default paraméterekkel történő előállítás
	 */
	public SVMClassifierFactory(){
		parameter = new svm_parameter();
		// C-SVC (multi-class)
		parameter.svm_type= 0;
		// RBF
		parameter.kernel_type =2;
	}
	/**
	 * 
	 *            Tanítópontok, playerID, és kör száma alapján előállít egy
	 *            hálót
	 * 
	 * @param points A tanítópontokat tartalmazó tömb 
	 * @param actions A játékosok cselekvéseit tartalmazó tömb
	 * @param stage A körök sorszáma a tanítópontokra nézve
	 * @return Kész svm_model
	 */
	public svm_model getSVMModel(SVMClassifierData[] points, int[] actions, int[] stages) {
		// TODO Auto-generated constructor stub
		Controller.debugWindow.printMessage("creating SVM model");
		parameter = new svm_parameter();
		parameter.svm_type = svm_parameter.POLY;
		problem = new svm_problem();
		problem.l = points.length;
		problem.x = new svm_node[problem.l][137];
		//a pontok átmásolása a problémába
		for(int i = 0; i < problem.l; i++){
			for(int j = 0; j < 136; j++){
				problem.x[i][j].value = points[i].getIntData(j);
			}
			//A stage hozzáadása
			problem.x[i][136].value = (double)stages[i];
		}
		
		
		double[] answers = new double[actions.length];
		problem.y = answers;
		
		return svm.svm_train(problem, parameter);
	}
}

